function sayHi(msg: string): void {
  console.log(msg);
}

// (msg: string) => void 表示一个函数字面类型。他是一种类型
const sayHello: (msg: string) => void = (msg: string) => { console.log(msg) }


// 函数是对象 函数也可以用interface来描述
interface IDATA {
  (userpwd?: number, id?: number): void
}

// 注意可选参数的定义必须在必选参数的后面
const getData: IDATA = (userpwd: number = 5555, id?: number) => {
  setTimeout(() => {
    console.log('获取数据', userpwd)
  }, 100)
}

getData()


// function getList(...args: (number | string)[]) {
//   console.log(args);
// }
// getList(1,2,3,4,5,6, 'hello')

function getList(...args: [number, string, ...boolean[]]) {
  console.log(args);
}
getList(1, 'hello', true, false, true, false)


// 这里必须写成函数声明，不然没有办法添加静态属性fnname
function fetchData(id: number)  {
  console.log('data');
}
fetchData.fnname = 'fetchData'

// 函数签名的好处 就是可以在里面定义静态属性 就是下面的fnname这个属性
let fn: {
  (id: number) : void
  fnname: string
} = fetchData


